package com.mingtai.design.principle.dependenceinversion;

/**
 * @author: tianmingtai
 * @create: 2020/12/09 20:41
 * @description: 定义：
 * <p>
 * 高层模块不应该依赖低层模块，两者都应该依赖其抽象；
 * 抽象不应该依赖细节；
 * 细节应该依赖抽象。
 * 依赖倒置原则在Java语言中的表现就是：
 * <p>
 * 模块间的依赖通过抽象发生，实现类之间不发生直接的依赖关系，其依赖关系是通过接口或抽象类产生的；
 * 接口或抽象类不依赖于实现类；
 * 实现类依赖接口或抽象类。
 * 更加精简的定义就是“面向接口编程”——OOD（Object-Oriented Design，面向对象设计）的精髓之一。
 */

public class Test {
    public static void main(String[] args) {
        // V1 这种实现方式，比较依赖底层实现，应用层需要依赖Ming类里面的具体实现
        // Ming ming = new Ming();
        // ming.studyFECourse();
        // ming.studyJavaCourse();


        // V2 接口方法注入方式
        // Ming ming = new Ming();
        // ming.studyCourse(new JavaCourse());
        // ming.studyCourse(new FECourse());

        // V3 构造器注入方式
        // Ming ming = new Ming(new JavaCourse());
        // ming.studyCourseV3();

        // V4 set方法注入
        Ming ming = new Ming();
        ming.setiCourse(new JavaCourse());
        ming.studyCourseV3();


        ming.setiCourse(new FECourse());
        ming.studyCourseV3();
    }
}
